package org.zjx.command.state;

import lombok.Data;

/**
 * 角色状态类
 * 包含角色基本属性、战斗属性、资源属性和状态信息
 */
@Data
public class RoleState implements IDataState {
    // ================ 角色基本信息 ================
//    private String playerId;           // 玩家账号 ID
//    private Race race;                 // 种族
//    private Sects sect;               // 角色所属门派
    private int level;                 // 角色的等级

    // ================ 角色资源属性 ================
    private int vitality;              // 当前活力值
    private int maxVitality;           // 最大活力值
    private int physical;              // 当前体力值
    private int maxPhysical;           // 最大体力值
    private int popularity;            // 角色的人气值
    private int gangContribution;      // 角色在帮派中的贡献
    private int sectContribution;      // 角色在门派中的贡献
    private int potential;             // 角色的潜力
    private long experience;           // 角色的经验值

    // ================ 战斗属性 ================
    private int health;                // 当前气血值
    private int maxHealth;             // 最大气血值
    private int mana;                  // 当前魔法值
    private int maxMana;               // 最大魔法值
    private int rage;                  // 当前愤怒值
    private int maxRage;               // 当前愤怒值
    private int injury;                // 伤势值(0-100, 0为无伤势)

    // ================ 经济属性 ================
    private long cash;                 // 角色的现金
    private long reserveFund;          // 角色的储备金
    private long deposit;              // 角色的存银


    private int hpPercentage = 100; //血量百分比
    private int mpPercentage = 100; //蓝量百分比
    private int ragePercentage; //愤怒百分比
    private int exePercentage; //经验百分比

    // ================ 实用方法 ================

    /**
     * 检查角色是否存活
     * @return true表示存活
     */
    public boolean isAlive() {
        return health > 0;
    }

    /**
     * 获取伤势百分比
     * @return 伤势百分比(0.0-1.0)
     */
    public double getInjuryPercentage() {
        return injury / 100.0;
    }

    /**
     * 恢复气血
     * @param amount 恢复量
     * @return 实际恢复量
     */
    public int recoverHealth(int amount) {
        int oldHealth = health;
        health = Math.min(maxHealth, health + amount);
        return health - oldHealth;
    }

    /**
     * 恢复魔法
     * @param amount 恢复量
     * @return 实际恢复量
     */
    public int recoverMana(int amount) {
        int oldMana = mana;
        mana = Math.min(maxMana, mana + amount);
        return mana - oldMana;
    }

    /**
     * 恢复活力
     * @param amount 恢复量
     * @return 实际恢复量
     */
    public int recoverVitality(int amount) {
        int oldVitality = vitality;
        vitality = Math.min(maxVitality, vitality + amount);
        return vitality - oldVitality;
    }

    /**
     * 恢复体力
     * @param amount 恢复量
     * @return 实际恢复量
     */
    public int recoverPhysical(int amount) {
        int oldPhysical = physical;
        physical = Math.min(maxPhysical, physical + amount);
        return physical - oldPhysical;
    }

    /**
     * 增加伤势
     * @param amount 增加的伤势值(0-100)
     */
    public void addInjury(int amount) {
        injury = Math.min(100, injury + amount);
    }

    /**
     * 治疗伤势
     * @param amount 治疗量
     * @return 实际治疗量
     */
    public int healInjury(int amount) {
        int oldInjury = injury;
        injury = Math.max(0, injury - amount);
        return oldInjury - injury;
    }

    /**
     * 检查是否有足够活力
     * @param amount 需要的活力值
     * @return true表示足够
     */
    public boolean hasEnoughVitality(int amount) {
        return vitality >= amount;
    }

    /**
     * 检查是否有足够体力
     * @param amount 需要的体力值
     * @return true表示足够
     */
    public boolean hasEnoughPhysical(int amount) {
        return physical >= amount;
    }
}